"""
参数化流程：
1. 导包
from parameterized import parameterized
2. 定义参数化数据
params_data = [
    ('登陆成功', {'mobile': '13800000002', 'password': '123456'},
     {'status_code': 200, 'success': True, 'code': 10000, 'message': '操作成功'}),
    ('用户名错误', {'mobile': '13800003342', 'password': '123456'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'}),
    ('密码错误', {'mobile': '13800000002', 'password': '123456abc'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'})
]
3. 参数化测试
@parameterized.expand(params_data)
def test_login(self, desc, body, expect_result):
    pass

参数化说明
1. 参数化数据和测试方法形参关系：元组元素和形参一一对应
params_data = [(元素1，元素2，元素3, ……), (), (), ()]
@parameterized.expand(params_data)
def test_login(self, 形参1, 形参2, 形参3, ……):
    pass
2. 测试方法执行的次数和列表[]中元素个数相匹配，即列表中有n个元素，测试方法执行n次
3. pycharm点击运行，不能点击方法名的位置，只能点击类名的位置
"""

# 1. 导包
import unittest
import requests
from parameterized import parameterized


class LoginApi:
    def __init__(self):
        # 实例属性，登陆网址
        self.login_url = "http://ihrm-test.itheima.net/api/sys/login"

    def login(self, body):
        """
        功能：发送登陆请求
        :param body: 发送请求的请求体
        :return: 发送登陆请求后的响应对象
        """
        resp = requests.post(self.login_url, json=body)
        return resp


params_data = [
    ('登陆成功', {'mobile': '13800000002', 'password': '123456'},
     {'status_code': 200, 'success': True, 'code': 10000, 'message': '操作成功'}),
    ('用户名错误，登陆失败', {'mobile': '13800003342', 'password': '123456'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'}),
    ('密码错误，登陆失败', {'mobile': '13800000002', 'password': '123456abc'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'})
]


class TestLogin(unittest.TestCase):
    @parameterized.expand(params_data)
    def test_login(self, desc, body, expect_result):
        print(f'desc = {desc}')
        print(f'body = {body}')
        print(f'expect_result = {expect_result}')

        # 发送请求
        # 实例化对象
        login_api = LoginApi()
        # 实例对象调用实例方法，获取响应对象
        response = login_api.login(body)
        print("json data =", response.json())

        # 断言
        json_data = response.json()
        self.assertEqual(200, response.status_code)
        self.assertEqual(expect_result.get('success'), json_data.get("success"))
        self.assertEqual(expect_result.get('code'), json_data.get("code"))
        self.assertIn(expect_result.get('message'), json_data.get("message"))
